Trong bài viết này mình sẽ giúp các bạn phân biệt thế nào là tham trị và thế nào là tham chiếu. Ở đây, mình sẽ sử dụng bài toán "Hoán đổi giá trị 2 biến kiểu nguyên" để dễ dàng hơn trong việc giải thích.
Đầu tiên mình sẽ nói về tham trị, ta có đoạn code như sau:
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
main() {
int a = 9, b = 2;
swap(a, b);
printf("a = %d, b = %d", a, b);
return 0;
}
Kết quả:
Sau khi chạy đoạn code trên, ta thấy giá trị của 2 biến a và b vẫn không thay đổi, skip lại đã! Hãy tiếp tục xem đoạn code sau khi sử dụng tham chiếu:
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
main() {
int a = 9, b = 2;
swap(a, b);
printf("a = %d, b = %d", a, b);
return 0;
}
Kết quả:
Oh, giá trị của 2 biến a,b đã hoán đổi cho nhau, câu hỏi đặt ra ở đây là tại sao khi sử dụng tham chiếu thì giá trị của 2 biến đã khởi tạo bị thay đổi sau khi chạy hàm "swap" còn tham trị thì không?
Để khái quát hơn, mời các bạn xem đoạn code nữa:
void swap1(int a, int b) {
int temp = a;
a = b;
b = temp;
printf("[swap1] address of a is %d", &a);
}
void swap2(int &a, int &b) {
int temp = a;
a = b;
b = temp;
printf("[swap2] address of a is %d", &a);
}
main() {
int a = 9, b = 2;
printf("[Main] address of a is %d", &a);
swap1(a, b);
swap2(a, b);
return 0;
}
Kết quả:
Trong đoạn code này, mình sử dụng cùng một lúc cả tham trị (hàm "swap1") và tham chiếu (hàm "swap2"). Cùng với đó là in ra địa chỉ của 2 biến a,b tại các thời điểm khác nhau! Các bạn có thể dễ dàng nhận ra rằng sau khi hàm "swap1" (tham trị) chạy thì địa chỉ của biến a đã bị thay đổi nhưng khi hàm "swap2" chạy thì địa chỉ khi in ra lại giống với địa chỉ ban đầu?
Có một sự mâu thuẫn nhẹ ở đây khi so sánh với 2 đoạn code mình đề cập ban đầu:
Tham trị: Địa chỉ của biến bị thay đổi >< Giá trị khi in ra vẫn giữ nguyên.
Tham chiếu: Địa chỉ của biến giống hệt với ban đầu >< Giá trị khi in ra đã bị hoán đổi.
Kết luận:
Để giải quyết được mẫu thuẫn trên, ta bắt buộc phải công nhận một điều là khi dùng tham trị, hàm sẽ tạo một biến mới nào đó, mình gọi nó là a' và lấy GIÁ TRỊ của biến được truyền vào a, vì thế, mọi thay đổi sẽ được áp dụng lên cái biến a' đó. Khi kết thúc hàm, biến a' bị giải phóng, còn biến a vẫn tồn tại và giữ giá trị ban đầu của nó. Còn khi dùng tham chiếu, biến được truyền vào chính xác là biến a, khi đó thay đổi sẽ áp dụng trực tiếp lên biến a, không có một thằng a' nào được tạo ra cả.
Hi vọng sau đọc bài này các bạn sẽ hiểu rõ hơn về tham trị, tham chiếu để sử dụng nó một cách thật hiệu quả, cám ơn anh Quốc Cường đã giúp mình thực hiện bài viết này!
Phân biệt tham trị và tham chiếu?
Reviewed by
Unknown
on
8:05 AM
Rating:
